Custom Datatypes


In [1]:
## Custom Iterator

In [22]:
class Counter():
    def __init__(self, large=1, small=0):
        self.large = large
        self.small = small
        self.num = small
    
    def __getitem__(self, key):
        if self.num < self.large:
            self.num +=1
        else:
            raise(IndexError)
        return self.num

In [24]:
for i in Counter(2, 10):
    print(i)

In [7]:
# generator
def uc_gen(text):
    for char in text:
        yield char.upper()

# generator expression
def uc_genexp(text):
    return (char.upper() for char in text)

# iterator protocol
class uc_iter():
    def __init__(self, text):
        self.text = text
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        try:
            result = self.text[self.index].upper()
        except IndexError:
            raise StopIteration
        self.index += 1
        return result

# getitem method
class uc_getitem():
    def __init__(self, text):
        self.text = text
    def __getitem__(self, index):
        result = self.text[index].upper()
        return result

In [11]:
for iterator in uc_gen, uc_genexp, uc_iter, uc_getitem:
    for ch in iterator('abcde'):
        print (ch, end="")
    print("")


ABCDE
ABCDE
ABCDE
ABCDE

References